#pragma once
#ifndef __SPORTS_MODE_H__
#define __SPORTS_MODE_H__
#include <stdbool.h>
#include <stdint.h>
#include <sports_mode_timer.h>
#include <platform_assert.h>
#include <platform_misc.h>
#include <sports_mode_cfg.h>
#include <sports_mode_common.h>

typedef enum __sports_mode_mode_t
{
    sports_mode_mode_invalid,
    sports_mode_mode_start,
    sports_mode_mode_gps_run = sports_mode_mode_start, //!< gps跑步
    sports_mode_mode_gps_ride,                         //!< gps骑行
    sports_mode_mode_gps_walk,                         //!< gps徒步
    sports_mode_mode_run_1,                            //!< 手环跑步-室内
    sports_mode_mode_rope,                             //!< 手环跳绳
    sports_mode_mode_swim,                             //!< 手环游泳
    sports_mode_mode_run_2,                            //!< 手环跑步-室外
    sports_mode_mode_walk,                             //!< 手环徒步
    sports_mode_mode_ride,                             //!< 手环骑行
    sports_mode_mode_work_out,                         //!< 手环锻炼
    sports_mode_mode_swing,                            //!<手环挥拍
    sports_mode_mode_basketball,                       //!<篮球
    sports_mode_mode_football,                         //!<足球
    sports_mode_mode_end,
} sports_mode_mode_t;

typedef enum __sports_mode_state_t
{
    sports_mode_state_idle,
    sports_mode_state_pause,
    sports_mode_state_normal,
} sports_mode_state_t;

/**
 * @brief
 *
 */
void sports_mode_start(sports_mode_mode_t);
/**
 * @brief
 *
 */
void sports_mode_stop(void);
/**
 * @brief
 *
 */
void sports_mode_stop_without_store(void);
/**
 * @brief
 *
 */
void sports_mode_pause(void);

/**
 * @brief
 *
 */
void sports_mode_resume(void);
/**
 * @brief 运动模式是否已停止
 *
 * @return true idle
 * @return false started
 */
PLATFORM_DEPRECATED("sports_mode_get_state instead")
bool sports_mode_is_idle(void);

/**
 * @brief
 *
 * @return int sports_mode_state_t
 */
int sports_mode_get_state(void);
/**
 * @brief 返回当前处于什么运动模式，会保留上一次的模式
 *
 * @return sports_mode_mode_t
 */
sports_mode_mode_t sports_mode_get_now_mode(void);

/**
 * @brief 返回当前处于什么运动下，idle状态下返回无效运动
 *
 * @return sports_mode_mode_t
 */
sports_mode_mode_t sports_mode_get_last_mode(void);

/**
 * @brief 获取运动开启了多久
 *
 * @return int 单位秒, 0 表示运动没有开启
 */
int32_t sports_mode_get_sports_duration(void);

/**
 * @brief
 *
 * @return int sports_mode_state_t
 */
uint32_t sports_mode_get_sports_start_time(void);
/**
 * @brief 获取运动暂停多久
 *
 * @return int 单位秒, 0 表示运动没有开启
 */
int32_t sports_mode_get_sports_pause_time(void);
/**
 * @brief
 *
 * @return uint32_t 单位小卡
 */
uint32_t sports_mode_get_sports_calorie(void);

/**
 * @brief
 *
 * @return uint32_t 单位米
 */
uint32_t sports_mode_get_sports_mileage(void);

/**
 * @brief
 *
 * @return uint32_t
 */
uint32_t sports_mode_get_sports_steps(void);

/**
 * @brief
 *
 * @return uint32_t
 */
uint32_t sports_mode_get_sports_steps_freq(void);

/**
 * @brief
 *
 * @return uint8_t
 */
uint8_t sports_mode_get_sports_minimal_heart_rate(void);

uint16_t sports_mode_get_sports_heart_rate_level_seconds(int level);

/**
 * @brief
 *
 * @return uint8_t
 */
uint8_t sports_mode_get_sports_maximum_heart_rate(void);
/**
 * @brief
 *
 * @return uint8_t
 */
uint8_t sports_mode_get_sports_avg_heart_rate(void);
/**
 * @brief 获取运动模式今天增加了多少卡路里, 仅提供给sport_get_calorie使用
 *
 * @return uint32_t
 */
uint32_t sports_mode_get_calorie(void);

/**
 * @brief 获取运动模式今天增加了多少距离, 仅提供给sport_get_distance使用
 *
 * @return uint32_t
 */
uint32_t sports_mode_get_distance(void);

/**
 * @brief 初始化存储
 *
 */
void sports_mode_ctor(void);

// /**
//  * @brief 获取当次心率详细
//  * @return 心率数值个数
//  */
// int sports_mode_get_heart_detail(uint8_t *p_heart);

/**
 * @brief 读取最近一次运动的详细信息,
 *
 * @param detail 外部提供缓存
 * @param count 将数据最多抽样成多少个
 * @return int 一共读到了多少
 */
int sports_mode_get_detail_info(sports_mode_detail_t *detail, uint32_t count);
/**
 * @brief 清除flash所有数据
 *
 */
void sports_mode_clear(void);
uint32_t sports_mode_get_accumulated_downhill(void);
uint32_t sports_mode_get_accumulated_climbing(void);
uint32_t sports_mode_get_maximum_speed(void);
int32_t sports_mode_get_avg_altitude(void);
#include <sports_mode_store.h>
#include <sports_mode_internal.h>
#endif //!<__SPORTS_MODE_H__
